grid a uchovani barvy bunky pri scrollu

Otázka od: Zapletal Martin

29. 6. 2004 10:01

Podle nejakeho stavu akce menim barvu bunky v gridu. Pokud je ale bunek vic
a musi se scrolovat tak vse co se na zacatku zmenilo, zmizi. Nevite jak
jednoduse tyto zmeny pamatovat? Probiha to v celkem casove narocne operaci a
zapisovani nekam a opetovne cteni by strasne cely proces zpomalilo. nemate
nekdo nejaky napad? Hral jsem si i s kreslenim primo na canvas, ale tam je
to pri scrolu stejne. velikost bunky musi byt 4x4 nebo 5x5. Take by to melo
byt co nejmensi. Existuje par komponent co to zvladnou, ale cim jednodusi
tim lepsi. Pred casem jsem to zde castecne resil, a byl mi doporucen
WirtualDrawTree ale to je pro tento ucel zbytecne slozite reseni.

Zapletal Martin


Odpovedá: Lukas Barton

29. 6. 2004 10:27

Me to v Delphi 7 Pro funguje.

Kreslim na grid v OnDrawCell eventu asi takto:


procedure TfrSklad.dgSkladDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var i:integer;
begin
  with Sender as TDrawGrid do
  begin
                if rezervace[ACol,ARow].stav=1 then
                            Canvas.Brush.Color := clYellow
                else if rezervace[ACol,ARow].stav=2 then
                            Canvas.Brush.Color := clBlue
                else if rezervace[ACol,ARow].stav =3 then
                            Canvas.Brush.Color := clRed
                else if rezervace[ACol,ARow].stav =4 then
                            Canvas.Brush.Color := clGreen
                else
                    Canvas.Brush.Color := clWhite;
                Canvas.FillRect(Rect);
    end;
end;


> Podle nejakeho stavu akce menim barvu bunky v gridu. Pokud je ale bunek
vic
> a musi se scrolovat tak vse co se na zacatku zmenilo, zmizi. Nevite jak
> jednoduse tyto zmeny pamatovat? Probiha to v celkem casove narocne operaci
a
> zapisovani nekam a opetovne cteni by strasne cely proces zpomalilo. nemate
> nekdo nejaky napad? Hral jsem si i s kreslenim primo na canvas, ale tam je
> to pri scrolu stejne. velikost bunky musi byt 4x4 nebo 5x5. Take by to
melo
> byt co nejmensi. Existuje par komponent co to zvladnou, ale cim jednodusi
> tim lepsi. Pred casem jsem to zde castecne resil, a byl mi doporucen
> WirtualDrawTree ale to je pro tento ucel zbytecne slozite reseni.
>
> Zapletal Martin


Odpovedá: Zapletal Martin

29. 6. 2004 14:20

no jo, ale ty to asi nacitas jednorazove a vsechny hodnoty znas a pak to
funguje. ale ja potrebuji pri vytvoreni formu udelat prazdne bunky(na to
pouziju OnDrawCell). Potom spustim nejakou funkci a potrebuji na zaklade
vysledku funkce obarvit prislusnou bunku, odpovidajici poradi cyklu. napr
1=cells[0,0] cervena, 2=cells[0,1] zelena atd. takze prvni obarvim OK, dalsi
ok, ale uz nevim jak na tom byla ta prvni. Tak ted nevim co delam spatne. Uz
jsem z toho srnka.

Martin

> procedure TfrSklad.dgSkladDrawCell(Sender: TObject; ACol, ARow: Integer;
> Rect: TRect; State: TGridDrawState);
> var i:integer;
> begin
> with Sender as TDrawGrid do
> begin
> if rezervace[ACol,ARow].stav=1 then
> Canvas.Brush.Color := clYellow
> else if rezervace[ACol,ARow].stav=2 then
> Canvas.Brush.Color := clBlue
> else if rezervace[ACol,ARow].stav =3 then
> Canvas.Brush.Color := clRed
> else if rezervace[ACol,ARow].stav =4 then
> Canvas.Brush.Color := clGreen
> else
> Canvas.Brush.Color := clWhite;
> Canvas.FillRect(Rect);
> end;
> end;


Odpovedá: Lukas Barton

29. 6. 2004 14:27

Uloz si nekam vysledek volani funkce a potom si zavolej refresh komponenty -
delam to taky tak a funguje to velice svizne i pro tabulku 50 x 300.
Po volani te funkce a ulozeni vysledku zavolej:

dgSklad.Repaint;


   Lukas

> no jo, ale ty to asi nacitas jednorazove a vsechny hodnoty znas a pak to
> funguje. ale ja potrebuji pri vytvoreni formu udelat prazdne bunky(na to
> pouziju OnDrawCell). Potom spustim nejakou funkci a potrebuji na zaklade
> vysledku funkce obarvit prislusnou bunku, odpovidajici poradi cyklu. napr
> 1=cells[0,0] cervena, 2=cells[0,1] zelena atd. takze prvni obarvim OK,
dalsi
> ok, ale uz nevim jak na tom byla ta prvni. Tak ted nevim co delam spatne.
Uz
> jsem z toho srnka.
>


Odpovedá: Zapletal Martin

29. 6. 2004 15:02

A to prave nechci, nedokazu si predstavit ukladani treba 100 000 polozek. A
to nikdy predem nevim kolik toho bude. Jak to ma udelany treba FlashGet?

Martin

> Uloz si nekam vysledek volani funkce a potom si zavolej refresh
komponenty -
> delam to taky tak a funguje to velice svizne i pro tabulku 50 x 300.
> Po volani te funkce a ulozeni vysledku zavolej:
>
> dgSklad.Repaint;


Odpovedá: Lebeda David

29. 6. 2004 15:19

> A to prave nechci, nedokazu si predstavit ukladani treba 100 000
> polozek.

> > Uloz si nekam vysledek volani funkce a potom si zavolej refresh
> komponenty -

Ahoj,

OnDrawCell se vola pomerne casto - vzdy, kdyz je treba bunku
prekreslit, coz je i tehdy, kdyz je bunka necim prekryta a pak se
odkryje. Proto asi budes muset mit nekde ulozeno, co ma byt v te ktere
bunce za barvu (stav). Jinak to grid pri nejblizsi vhodne prilezitosti
prekresli tim, co je v OnDrawCell nebo standardnim vzhledem. Ze bys
nekam neco namaloval a ono tam bylo "na veky veku"...nevim nevim,
tomu moc neverim.

David Lebeda

Odpovedá: petr palicka

29. 6. 2004 15:16

Ahoj,

   jestlize pouzivas nejaky drawgrid, nemel by byt problem si stav
(jeden byte az integer) ulozit nekam do jeho bunky a pri malovani se jim
ridit.
pokud by to byl byte (at si klidne nezavisle pole [x, y] of byte, kdyz
ne primo do gridu), tak je to 100 000 B = necelych 100KB pameti. to by
imho slo i na strojich s par megama RAMky.

peca


Odpovedá: Zapletal Martin

30. 6. 2004 7:00

No, WirtualDrawTree to opravdu umi, ale na takovou pomerne jednoduchou vec
je to az moc slozita komponenta a nepodarilo se mi udelat tak malou bunku
jak bych chtel(4x4). Skusim to s tim ukladanim treba do pole, ale mam
strach, ze to zpomaly cely cyklus. No uvidim.

Martin

>OnDrawCell se vola pomerne casto - vzdy, kdyz je treba bunku
> prekreslit, coz je i tehdy, kdyz je bunka necim prekryta a pak se
> odkryje. Proto asi budes muset mit nekde ulozeno, co ma byt v te ktere
> bunce za barvu (stav). Jinak to grid pri nejblizsi vhodne prilezitosti
> prekresli tim, co je v OnDrawCell nebo standardnim vzhledem. Ze bys
> nekam neco namaloval a ono tam bylo "na veky veku"...nevim nevim,
> tomu moc neverim.